package com.reflect.demo05;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
        System.out.println("通过反射获取信息");

        // 通过反射获取Class 实例
        Class cls = Class.forName("com.reflect.demo05.User");

        /**
         * 获取类的名称
         * getName() 获取完整的类名
         * getSimpleName() 获取单一类名
         */
        System.out.println(cls.getName());// com.reflect.demo05.User
        System.out.println(cls.getSimpleName()); // User

        /**
         * 获取类的字段信息
         * getFields() 仅能获取访问权限是 public 的属性
         * getDeclaredFields() 获取所有的属性
         */
        Field[] fields = cls.getFields();// null
        for (Field field : fields) {
            System.out.println(field);// public java.lang.String com.reflect.demo05.User.title
        }

        fields  = cls.getDeclaredFields();
        for (Field field : fields) {
            /**
             * public java.lang.String com.reflect.demo05.User.title
             * private java.lang.String com.reflect.demo05.User.name
             * private int com.reflect.demo05.User.age
             */
            System.out.println(field);
        }
        /**
         * 获取指定属性
         * getDeclaredField(); 获取指定属性
         */
        Field name1 = cls.getDeclaredField("name");
        System.out.println(name1);

        /**
         * 获取方法
         * getMethods() 获取本类和父类 访问权限是public的方法
         * getDeclaredMethods() 获取本类的所有方法
         */
        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println("正常方法："+method);
        }
        methods = cls.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法："+method);
        }
        /**
         * 获取指定方法
         * getMethod(string); 获取public访问权限方法
         * getDeclaredMethod(string); 获取本类所有方法
         */
        Method getName = cls.getMethod("getName",null);
        System.out.println(getName);// public java.lang.String com.reflect.demo05.User.getName()
        // 需要
        Method setAge = cls.getMethod("setAge", int.class);

        // 可以获取私有方法
        Method getName2 = cls.getDeclaredMethod("run",null);
        System.out.println(getName2);

        /**
         * 构造方法
         * getConstructors(); 仅能获取 public 的构造方法
         * getDeclaredConstructors(); 获取所有的构造方法
         */
        Constructor[] constructors = cls.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        constructors = cls.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        // 获取指定构造方法
        Constructor s = cls.getDeclaredConstructor(String.class,int.class);
        System.out.println(s);
    }
}
